抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

本篇笔记主要用于记录ABAP开发过程中常用的字符串操作。其中除了常规的操作外还涉及到CO、CN、CA、NA、CS、NS、CP和NP等相关的内容。

ABAP 字符串操作详解

一、获取字符串长度

1.介绍

用于获取常见的字符串长度,语法有两种。

  • STRLEN( str ),变量与括号之间需要有空格进行区分
  • DESCRIBE FIND <字符串> LENGTH <数值变量> [IN BYTE | CHARACTER MODE]

2.语法结构

1
2
3
4
5
"获取变量内容的长度
STRLEN( str ).

"获取变量定义的长度
DESCRIBE FIND <字符串> LENGTH <数值变量> [IN BYTE | CHARACTER MODE]

3.语法解释与应用

(1)STRLEN( str )

通过这种方式获取到的字符串长度是字符串内容的实际长度,即便定义的字符串长度固定为80,他返回的也是字符串中实际值的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DATA:
LV_LENGTH TYPE I,
LV_STRING1 TYPE STRING VALUE 'Learn from yesterday, live for today, hope for tomorrow.',
LV_STRING2 TYPE STRING VALUE `Don't look back, just haven't found leave your reasons.`.

WRITE:/ 'STRLEN 语法测试,第一个语句为String类型,第二个为Char80'.
WRITE:/.

LV_LENGTH = STRLEN( LV_STRING1 ).
WRITE:/ LV_STRING1.
WRITE:/ '上述短文的长度为: ',LV_LENGTH.

LV_LENGTH = STRLEN( LV_STRING2 ).
WRITE:/ LV_STRING2.
WRITE:/ '上述短文的长度为: ',LV_LENGTH.

"运行结果:
"STRLEN 语法测试,第一个语句为String类型,第二个为Char80

"Learn from yesterday, live for today, hope for tomorrow.
"上述短文的长度为: 54
"Don't look back, just haven't found leave your reasons.
"上述短文的长度为: 54
(2)DESCRIBE

通过这种方式只能获取固定长度变量的定义的长度,无法获取到变量中存在的值的长度。拥有两种获取长度的方式。一种是获取位的长度IN BYTE MODE);一种是获取变量定义的字符长度(IN CHARACTER MODE)。但是获取字符长度的定一个是无法应用于String类型的变量。因为其是不定长的,但是获取位长度的方式可以获取到String类型变量的系统默认位长度为8.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DATA:
LV_LENGTH TYPE I,
LV_STRING1 TYPE STRING VALUE 'Learn from yesterday, live for today, hope for tomorrow.',
LV_STRING2 TYPE STRING VALUE `Don't look back, just haven't found leave your reasons.`.

WRITE:/ 'DESCRIBE FIELD 语法测试,第一个语句为String类型,第二个为Char80'.
WRITE:/.

"这种方式获取的是定义的变量长度,若值的长度小于定义长度,系统会自动填充到指定长度
DESCRIBE FIELD LV_STRING1 LENGTH LV_LENGTH IN BYTE MODE.
WRITE:/ LV_STRING1.
WRITE:/ '位长度,上述短文的长度为: ',LV_LENGTH.

DESCRIBE FIELD LV_STRING2 LENGTH LV_LENGTH IN BYTE MODE.
WRITE:/ LV_STRING2.
WRITE:/ '位长度,上述短文的长度为: ',LV_LENGTH.

"这种形式的获取长度方式无法获取String类型变量的长度,所以只能获取固定长度类型变量的定义时的长度
DESCRIBE FIELD LV_STRING2 LENGTH LV_LENGTH IN CHARACTER MODE.
WRITE:/ LV_STRING2.
WRITE:/ '字符长度,上述短文的长度为: ',LV_LENGTH.

"运行结果:
"DESCRIBE FIELD 语法测试,第一个语句为String类型,第二个为Char80

"Learn from yesterday, live for today, hope for tomorrow.
"位长度,上述短文的长度为: 8
"Learn from yesterday, live for today, hope for tomorrow.
"位长度,上述短文的长度为: 160
"Don't look back, just haven't found leave your reasons.
"字符长度,上述短文的长度为: 80

二、查找字符串 Find

1.介绍

Find关键字用于查询特定字符或字符串是否存在于字符串,也可以查找字符是否存在于内表。使用系统变量 SY-SUBRC 来获取查询结果。若系统变量为0则查找到相关内容,反之若为4则没有查找到。并且使用该语句查询的字符是默认严格区分大小写的,若存在相同的字符,但是大小写不一致也是会按照没有查找到数据返回的。当然这只是默认的情况,也可以通过下面介绍的关键词IGNORING CASE来取消区分大小写。此外还有一个SAP已经淘汰的查询关键词Search关键字,其效果和Find类似,依然可以在SAP中使用。

2.语法结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FIND [{FIRST OCCURRENCE} | {ALL OCCURRENCES} OF] pattern(查找的内容) IN [section of] dobj
[{RESPECTING | IGNORING} CASE]
[MATCH COUNT mcnt] |
{ {[MATCH OFFSET moff]
[MATCH LENGTH mlen]} |
[RESULTS result_tab | result_wa] }
[SUBMATCHES s1 s2 ...] ...

search <被操作字符串> for <子串>
[in (byte|character) mode]
[starting at <数字>]
[ending at <数字>]
[ABBREVIATED]
[and mark]
Starting at:指定查询范围
Ending at :指定查询范围
"查找字符串中是否有对应子串,如果查找到sy-subrc = 0,没找到sy-subrc=4。在sy-fdpos中存放查找到子串字符开始位置

3.语法解释与应用

(1)仅查找 FIND

主要用于在字符串中查找对应的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DATA:
LV_FIND TYPE STRING VALUE 'AA',
LV_STRING0 TYPE STRING VALUE 'DHFIOASDHFJKAASHDFIUASHDFPAASDFJHASIFHDFJKLGSDJIKFGN',
LV_STRING4 TYPE STRING VALUE 'AHDFGIUFHASIOUDFHASDHFFHFHAIOSDFHFHAKLSJDFHKJLASHDFD'.

FIND LV_FIND IN LV_STRING0.
IF SY-SUBRC EQ 0.
WRITE:/ '查找到了'.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果: 查找到了

FIND LV_FIND IN LV_STRING4.
IF SY-SUBRC EQ 0.
WRITE:/ '查找到了'.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果: 未查找到
(2)查找位置与长度信息 MATCH OFFSET / LENGTH

可以使用MATCH OFFSETMATCH LENGTH 关键词获取查找内容的位置与长度。若未查找数据,则不会更新MATCH OFFSETMATCH LENGTH 关键词后接受位置信息与长度信息的变量,所以在使用前请清空用于存放位置信息与长度信息的变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"沿用上面的变量
DATA:
LV_POSTION TYPE I,
LV_LENGTH TYPE I.

FIND LV_FIND IN LV_STRING0
MATCH OFFSET LV_POSTION
MATCH LENGTH LV_LENGTH.
IF SY-SUBRC EQ 0.
WRITE:/ '位置为: ', LV_POSTION, '长度为: ', LV_LENGTH.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果: 位置为: 12 , 长度为: 2

CLEAR: LV_POSTION,LV_LENGTH. "使用之前需要清空位置与长度变量,因为查找失败之后并不会修改LV_POSTION,LV_LENGTH的变量值,这两个变量还是原先的值
FIND LV_FIND IN LV_STRING0
MATCH OFFSET LV_POSTION
MATCH LENGTH LV_LENGTH.
IF SY-SUBRC EQ 0.
WRITE:/ '位置为: ', LV_POSTION, '长度为: ', LV_LENGTH.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果: 未查找到
(3)查找并返回出现次数 MATCH COUNT

使用MATCH COUNT关键词,当查询到相对应的内容时会返回对应内容出现的次数。另外值得注意的是和上面获取位置与长度信息类似,在使用获取查找内容次数的变量前需要清空,不然变量会延续上一次的值,可能会造成逻辑异常。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
"沿用上面的变量
DATA:
LV_COUNT TYPE I.

FIND ALL OCCURRENCES OF LV_FIND IN LV_SRING0
MATCH COUNT LV_COUNT.
IF SY-SUBRC EQ 0.
WRITE:/ '出现次数为: ', LV_COUNT.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果: 出现次数为: 2

CLEAR: LV_COUNT.
FIND ALL OCCURRENCES OF LV_FIND IN LV_STRING4
MATCH COUNT LV_COUNT.
IF SY-SUBRC EQ 0.
WRITE:/ '出现次数为: ', LV_COUNT.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果: 未查找到
(4)查找内容并将结果放入内表 RESULTS

使用RESULTS关键词可以将查找到的内容和结果放入内表中,但是到目前为止似乎无法使用Find关键词进行模糊查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
"沿用上面的变量
DATA:
LT_RESULT TYPE MATCH_RESULT_TAB.
FIELD-SYMBOLS:
<FS_RESULT> LIKE LINE OF LT_RESULT.

FIND ALL OCCURRENCES OF LV_FIND IN LV_STRING0
RESULT LT_RESULT.
IF SY-SUBRC EQ 0.
LOOP AT LT_RESULT ASSIGNING <FS_RESULT>.
WRITE:/ '所在位置为: ',<FS_RESULT>-OFFSET,' 查找内容长度为: ',<FS_RESULT>-LENGTH.
ENDLOOP.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果:所在位置为: 12 查找内容长度为: 2
" 所在位置为: 26 查找内容长度为: 2

REFRESH LT_RESULT.
FIND ALL OCCURRENCES OF LV_FIND IN LV_STRING4
RESULT LT_RESULT.
IF SY-SUBRC EQ 0.
LOOP AT LT_RESULT ASSIGNING <FS_RESULT>.
WRITE:/ '所在位置为: ',<FS_RESULT>-OFFSET,' 查找内容长度为: ',<FS_RESULT>-LENGTH.
ENDLOOP.
ELSE.
WRITE:/ '未查找到'.
ENDIF.
"运行结果: 未查找到
(5)查找内容并将结果放入内表 IN TABLE

使用关键词IN TABLE此处虽然可以查询内表中的内容,但是只能获取到查找到内容在内表中的行数,位置和长度等信息。但是查找的内表只能是但字段的内表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
"沿用上面的变量
DATA:
BEGIN OF LS_ITAB,
STR TYPE CHAR30,
END OF LS_ITAB,
LT_ITAB LIKE TABLE OF LS_ITAB.

LS_ITAB-STR = 'DHFIOASDHFJKAA'.
APPEND LS_ITAB TO LT_ITAB.

LS_ITAB-STR = 'SHDFIUASHDFPAASDFJHA'.
APPEND LS_ITAB TO LT_ITAB.

LS_ITAB-STR = 'SIFHDFJKLGSDJIKFGN'.
APPEND LS_ITAB TO LT_ITAB.

FIND ALL OCCURRENCES OF LV_FIND IN TABLE LT_ITAB
RESULT LT_RESULT.
LOOP AT LT_RESULT ASSIGNING <FS_RESULT>.
WRITE:/ '内容在内表的行数: ',<FS_RESULT>-LINE,
' 查找内容在当前行的位置: ',<FS_RESULT>-OFFSET,
' 查找内容的长度: ',<FS_RESULT>-LENGTH.
ENDLOOP.
"运行结果:
"内容在内表的行数: 1 查找内容在当前行的位置: 12 查找内容的长度: 2
"内容在内表的行数: 2 查找内容在当前行的位置: 12 查找内容的长度: 2
(6)取消或区分大小写匹配

FIND 关键词一般情况下是默认区分大小写匹配的,但是也可以使用下面的关键词进行取消和区分大小写匹配原则。

  • RESPECTING CASE:严格匹配,区分大小写匹配原则
  • IGNORING CASE:不严格匹配,不区分大小写匹配原则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
"沿用上面的变量
LV_FIND = 'aa'.
"严格匹配,区分大小写
FIND LV_FIND IN LV_STRING0.
IF SY-SUBRC EQ 0.
WRITE:/ '匹配值为: ',LV_FIND,'查询到了'.
ELSE.
WRITE:/ '小写关键字未查询到'.
ENDIF.
"运行结果:小写关键字未查询到

FIND LV_FIND IN LV_STRING RESPECTING CASE.
IF SY-SUBRC EQ 0.
WRITE:/ '匹配值为: ',LV_FIND,'查询到了'.
ELSE.
WRITE:/ '小写关键字未查询到'.
ENDIF.
"运行结果:小写关键字未查询到

"不严格匹配,不区分大小写
FIND LV_FIND IN LV_STRING IGNORING CASE.
IF SY-SUBRC EQ 0.
WRITE:/ '匹配值为: ',LV_FIND,'查询到了'.
ELSE.
WRITE:/ '小写关键字未查询到'.
ENDIF.
"运行结果:
"匹配值为: aa 查询到了

三、字符串替换 REPLACE

1.介绍

一般用于替换字符串中的内容,有两种语法结构。一种结构是根据字串进行匹配然后替换,另一种是根据位置和长度信息进行替换。

2.语法结构

1
2
3
4
5
6
7
REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] pattern 
IN [section_of] dobj WITH new
[IN {CHARACTER|BYTE} MODE]
[replace_options].

REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new
[IN {CHARACTER|BYTE} MODE].

3.语法解释与应用

(1)替换首次出现的内容 FIRST OCCURRENCE(默认)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING
VALUE 'QWERTYUIOPASDFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM',
LV_REPLACE TYPE STRING VALUE 'QWE'.
*----------------------------Logic-------------------------------------*
"替换首次出现的内容
"REPLACE LV_REPLACE IN LV_STRING WITH ''. 上下两句效果相同
REPLACE FIRST OCCURRENCE OF LV_REPLACE IN LV_STRING WITH ''.
IF SY-SUBRC NE 0.
"替换失败
MESSAGE S000 WITH '替换失败' DISPLAY LIKE GC_E.
ENDIF.
WRITE: LV_STRING.
"运行结果:
"RTYUIOPASDFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM
(2)替换所有出现的内容 ALL OCCURRENCES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING
VALUE 'QWERTYUIOPASDFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM',
LV_REPLACE TYPE STRING VALUE 'QWE'.
*----------------------------Logic-------------------------------------*
"替换首次出现的内容
REPLACE ALL OCCURRENCES OF LV_REPLACE IN LV_STRING WITH ''.
IF SY-SUBRC NE 0.
"替换失败
MESSAGE S000 WITH '替换失败' DISPLAY LIKE GC_E.
ENDIF.
WRITE: LV_STRING.
"运行结果:
"RTYUIOPASDFGHJKLZXCVBNM|RTYUIOPASDFGHJKLZXCVBNM
(3)以字符模式 IN CHARACTER MODE (默认)

按照字符的形式,逐个替换对应的内容。效果其实和上面的一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING
VALUE 'QWERTYUIOPASDFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM',
LV_REPLACE TYPE STRING VALUE 'QWE'.
*----------------------------Logic-------------------------------------*
"以字符模式
REPLACE LV_REPLACE IN LV_STRING WITH '' IN CHARACTER MODE.
IF SY-SUBRC NE 0.
"替换失败
MESSAGE S000 WITH '替换失败' DISPLAY LIKE GC_E.
ENDIF.
WRITE: LV_STRING.
"运行结果:
"RTYUIOPASDFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM
(4)以字节模式 IN BYTE MODE

按照字节的形式进行替换,替换语句中的所有变量类型均为XXSTRING类型。

(5)按照长度与位置替换 REPLACE SECTION
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING
VALUE 'QWERTYUIOPASDFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM',
LV_REPLACE TYPE STRING VALUE 'QWE'.
*----------------------------Logic-------------------------------------*
"根据字符位置与长度替换
"从5号字符开始,将之后的8个字符替换为空
REPLACE SECTION OFFSET 5 LENGTH 8 OF LV_STRING WITH ''.
IF SY-SUBRC NE 0.
"替换失败
MESSAGE S000 WITH '替换失败' DISPLAY LIKE GC_E.
ENDIF.
WRITE: LV_STRING.
"运行结果:
"QWERTFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM

"从0号字符开始,将之后的3个字符替换为123
REPLACE SECTION OFFSET 0 LENGTH 3 OF LV_STRING WITH '123'.
IF SY-SUBRC NE 0.
"替换失败
MESSAGE S000 WITH '替换失败' DISPLAY LIKE GC_E.
ENDIF.
WRITE: LV_STRING.
"运行结果:
"123RTFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM
(6)替换字符串的其余属性

长度属性不知道为什么,运行出来的结果一直是0。即便换成替换第一个出现的也是一样的效果。但是其余的两个属性都是正常的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING
VALUE 'QWERTYUIOPASDFGHJKLZXCVBNM|QWERTYUIOPASDFGHJKLZXCVBNM',
LV_REPLACE TYPE STRING VALUE 'QWE',
LV_COUNT TYPE I,
LV_OFFSET TYPE I,
LV_LENGTH TYPE I.
*----------------------------Logic-------------------------------------*
REPLACE ALL OCCURRENCES OF LV_REPLACE IN LV_STRING WITH ''
"替换次数
REPLACEMENT COUNT LV_COUNT
"最后一次替换位置
REPLACEMENT OFFSET LV_OFFSET
"替换字符串的长度
REPLACEMENT LENGTH LV_LENGTH.
IF SY-SUBRC NE 0.
"替换失败
MESSAGE S000 WITH '替换失败' DISPLAY LIKE GC_E.
ENDIF.
WRITE: LV_STRING.
WRITE: / '替换次数:', LV_COUNT,
/ '最后一次替换位置:',LV_OFFSET,
/ '替换字符串的长度:',LV_LENGTH.
"运行结果:
"RTYUIOPASDFGHJKLZXCVBNM|RTYUIOPASDFGHJKLZXCVBNM
"替换次数:2
"最后一次替换位置:24
"替换字符串的长度:0

四、移位操作 SHIFT

1.介绍

对字符串整体进行移位操作,可以整体左移也可以整体右移。默认情况下是移动一位,但是也可以根据自身的需求进行设置。在右移时,类型为String类型的变量移位不会改变原有的有内容的部分,只会在原有内容前新增空行。因为该类型的变量是不定长的,所以右移新增行时,长度是会随着移位操作变长的。但是定长的变量在移位过程中的内容是会受到影响的。

2.语法结构

1
2
SHIFT dobj [ {[places][direction]} | deleting ] 
[IN {CHARACTER|BYTE} MODE].

3.语法解释与应用

(1)移动一位操作 SHIFT
① 左移一位
1
2
3
4
5
6
7
8
9
10
11
12
13
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE '0001000200030004000',
LV_CHAR TYPE CHAR10 VALUE '0001234567'.
*----------------------------Logic-------------------------------------*
"默认左移一位
SHIFT LV_STRING.
SHIFT LV_CHAR.
WRITE: / LV_STRING,
/ LV_CHAR.
"运行结果:
"001000200030004000
"001234567
② 右移一位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE '0001000200030004000',
LV_CHAR TYPE CHAR10 VALUE '0001234567'.
*----------------------------Logic-------------------------------------*
WRITE: / LV_STRING,
/ LV_CHAR.

"右移一位
SHIFT LV_STRING RIGHT.
SHIFT LV_CHAR RIGHT.
WRITE: / LV_STRING,
/ LV_CHAR.
"运行结果:
"0001000200030004000
"0001234567
" 0001000200030004000
" 000123456
(2)移动多位 BY n PLACES
① 左移5位
1
2
3
4
5
6
7
8
9
10
11
12
13
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE '0001000200030004000',
LV_CHAR TYPE CHAR10 VALUE '0001234567'.
*----------------------------Logic-------------------------------------*
"左移5位
SHIFT LV_STRING BY 5 PLACES.
SHIFT LV_CHAR BY 5 PLACES.
WRITE: / LV_STRING,
/ LV_CHAR.
"运行结果:
"00200030004000
"34567
② 右移5位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE '0001000200030004000',
LV_CHAR TYPE CHAR10 VALUE '0001234567'.
*----------------------------Logic-------------------------------------*
WRITE: / LV_STRING,
/ LV_CHAR.

"右移5位
SHIFT LV_STRING BY 5 PLACES RIGHT.
SHIFT LV_CHAR BY 5 PLACES RIGHT.
WRITE: / LV_STRING,
/ LV_CHAR.
"运行结果:
"0001000200030004000
"0001234567
" 0001000200030004000
" 00012
(3)循环移动 CIRCULAR

循环移动其实就是把字符串首尾相接,左移的字符拼接到字符串的右侧,右移的字符拼接到字符串的左侧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE '0001000200030004000',
LV_CHAR TYPE CHAR10 VALUE '0001234567'.
*----------------------------Logic-------------------------------------*
"左循环移动
SHIFT LV_STRING BY 5 PLACES CIRCULAR.
SHIFT LV_CHAR BY 5 PLACES CIRCULAR.
WRITE: / LV_STRING,
/ LV_CHAR.

"右循环移动
SHIFT LV_STRING BY 5 PLACES RIGHT CIRCULAR.
SHIFT LV_CHAR BY 5 PLACES RIGHT CIRCULAR.
WRITE: / LV_STRING,
/ LV_CHAR.
"运行结果:先左移5位再右移5位,最终的结果值不变
"0020003000400000010
"3456700012
"0001000200030004000
"0001234567
(4)去掉重复字符串(前导零)

该语句在去除前导零时经常使用。

① 左移去除重复字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE '0001000200030004000',
LV_CHAR TYPE CHAR10 VALUE '0001234000'.
*----------------------------Logic-------------------------------------*
"左移去除重复字符串
SHIFT LV_CHAR LEFT DELETING LEADING '0'.
SHIFT LV_STRING LEFT DELETING LEADING '0'.
WRITE: / LV_STRING,
/ LV_CHAR.
"运行结果:
"1000200030004000
"1234000

"去除前导零也可以使用下面的Function
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = LV_CHAR
IMPORTING
OUTPUT = LV_CHAR.
② 右移去除重复字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE '0001000200030004000',
LV_CHAR TYPE CHAR10 VALUE '0001234000'.
*----------------------------Logic-------------------------------------*
WRITE: / LV_STRING,
/ LV_CHAR.

"右移去除重复字符串
SHIFT LV_CHAR RIGHT DELETING TRAILING '0'.
SHIFT LV_STRING RIGHT DELETING TRAILING '0'.
WRITE: / LV_STRING,
/ LV_CHAR.
"运行结果:
"0001000200030004000
"0001234000
" 0001000200030004
" 0001234

五、增加前导零 UNPACK

1.介绍

这是由Shift变量的去除前导零引申出来的一个知识点。他会根据定长变量的长度与实际值添加前导零,直至实际内容长度与定长变量的长度一致。

2.语法结构

1
UNPACK source TO destination. 

3.语法解释与应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*--------------------------Variables-----------------------------------*
DATA:
LV_CHAR TYPE CHAR10 VALUE '113'.
*----------------------------Logic-------------------------------------*
UNPACK LV_CHAR TO LV_CHAR.
WRITE: LV_CHAR.

UNPACK '1' TO LV_CHAR.
WRITE: LV_CHAR.

"使用Function添加前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = '12'
IMPORTING
OUTPUT = LV_CHAR.
WRITE: LV_CHAR.

"运行结果:
"0000000113 0000000001 0000000012

六、字符串大小写 TRANSLATE

1.介绍

该关键字不仅可以对字符串进行大小写的切换,还可以使用USING语法对其中的字符进行切换,但是这种切换是会识别字符的大小写的。

2.语法结构

1
2
TRANSLATE text {TO {UPPER|LOWER} CASE} 
| {USING mask}.

3.语法解释与应用

(1)切换大写 UPPER
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE 'QWErty',
LV_STRUPPER TYPE STRING VALUE 'QWERTY',
LV_STRLOWER TYPE STRING VALUE 'qwerty'.
*----------------------------Logic-------------------------------------*
"大写切换
TRANSLATE LV_STRING TO UPPER CASE.
TRANSLATE LV_STRUPPER TO UPPER CASE.
TRANSLATE LV_STRLOWER TO UPPER CASE.

WRITE: / LV_STRING,
/ LV_STRUPPER,
/ LV_STRLOWER.
"运行结果:
"QWERTY
"QWERTY
"QWERTY
(2)切换小写 LOWER
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE 'QWErty',
LV_STRUPPER TYPE STRING VALUE 'QWERTY',
LV_STRLOWER TYPE STRING VALUE 'qwerty'.
*----------------------------Logic-------------------------------------*
"小写切换
TRANSLATE LV_STRING TO LOWER CASE.
TRANSLATE LV_STRUPPER TO LOWER CASE.
TRANSLATE LV_STRLOWER TO LOWER CASE.

WRITE: / LV_STRING,
/ LV_STRUPPER,
/ LV_STRLOWER.
"运行结果:
"qwerty
"qwerty
"qwerty
(3)字符替换 USING

关键词USING后面跟的是字符对,即QA、qa等,这样的是字符对。还是以前面的举例为例,在进行匹配时,会将字符对的第一个字符作为被替换的字符,后一个为替换值进行替换。即在字符串中搜索Q字符,这个匹配是严格匹配的,即区分大小写。若找到了Q字符,则将其替换为A字符。同理对于qa字符对,若字符串中存在q字符,则将其替换为a。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING TYPE STRING VALUE 'QWErty',
LV_STRUPPER TYPE STRING VALUE 'QWERTY',
LV_STRLOWER TYPE STRING VALUE 'qwerty'.
*----------------------------Logic-------------------------------------*
"字符切换
"将大写的Q转换为A,将小写的r转换为b
"将小写的q转换为a,将大写的R转换为B
TRANSLATE LV_STRING USING 'QAqaRBrb'.
TRANSLATE LV_STRUPPER USING 'QAqaRBrb'.
TRANSLATE LV_STRLOWER USING 'QAqaRBrb'.

WRITE: / LV_STRING,
/ LV_STRUPPER,
/ LV_STRLOWER.
"运行结果:
"AWEbty
"AWEBTY
"awebty

七、字符串去空格 CONDENSE

1.介绍

使用CONDENSE关键字去除字符串的空格,当不添加NO-GAPS关键词时只去除字符串首尾两端的空格。当添加NO-GAPS关键词时,则去除字符串中所有的空格,即便是字符串中间的空格也会被去掉。

2.语法结构

1
CONDENSE text [NO-GAPS]. 

3.语法解释与应用

(1)去除首位两端的空格 CONDENSE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
*--------------------------Variables-----------------------------------*
DATA:
BEGIN OF LS_STRUCTURE,
TEXT1 TYPE C LENGTH 20 VALUE 'Hello',
TEXT2 TYPE C LENGTH 20 VALUE 'World.',
TEXT3 TYPE C LENGTH 20 VALUE 'l am an',
TEXT4 TYPE C LENGTH 20 VALUE 'ABAP',
TEXT5 TYPE C LENGTH 20 VALUE 'programmer.',
END OF LS_STRUCTURE.
DATA:
LV_TEXT TYPE STRING,
LV_STRING TYPE STRING VALUE ` QWE `,
LV_STRNUL TYPE STRING VALUE ` Q W E `.
*----------------------------Logic-------------------------------------*
LV_TEXT = LS_STRUCTURE.

WRITE: / '转换前:',
/ LV_TEXT,
/ LV_STRING,
/ LV_STRNUL.

CONDENSE LV_TEXT.
CONDENSE LV_STRING.
CONDENSE LV_STRNUL.

WRITE: / '转换后:',
/ LV_TEXT,
/ LV_STRING,
/ LV_STRNUL.
"下图中的中括号中间的值为实际值,前后两端都是带有空格的
"转换前:
"Hello World. l am an ABAP programmer.
"[ QWE ]
"[ Q W E ]
"转换后:
"Hello World. l am an ABAP programmer.
"QWE
"Q W E
1.字符串去空格-末尾空格展示
(2)去除全部空格 NO-GAPS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
*--------------------------Variables-----------------------------------*
DATA:
BEGIN OF LS_STRUCTURE,
TEXT1 TYPE C LENGTH 20 VALUE 'Hello',
TEXT2 TYPE C LENGTH 20 VALUE 'World.',
TEXT3 TYPE C LENGTH 20 VALUE 'l am an',
TEXT4 TYPE C LENGTH 20 VALUE 'ABAP',
TEXT5 TYPE C LENGTH 20 VALUE 'programmer.',
END OF LS_STRUCTURE.
DATA:
LV_TEXT TYPE STRING,
LV_STRING TYPE STRING VALUE ` QWE `,
LV_STRNUL TYPE STRING VALUE ` Q W E `.
*----------------------------Logic-------------------------------------*
LV_TEXT = LS_STRUCTURE.

WRITE: / '转换前:',
/ LV_TEXT,
/ LV_STRING,
/ LV_STRNUL.

CONDENSE LV_TEXT NO-GAPS.
CONDENSE LV_STRING NO-GAPS.
CONDENSE LV_STRNUL NO-GAPS.

WRITE: / '转换后:',
/ LV_TEXT,
/ LV_STRING,
/ LV_STRNUL.
"下图中的中括号中间的值为实际值,前后两端都是带有空格的
"转换前:
"Hello World. l am an ABAP programmer.
"[ QWE ]
"[ Q W E ]
"转换后:
"HelloWorld.lamanABAPprogrammer.
"QWE
"QWE

八、字符串拼接

1.介绍

字符串拼接有两种方式。

  • 使用关键词CONCATENATE
  • 使用拼接符 **&&**(ECC6.0等旧版本中不支持该语句)

在拼接字符串的时候,为了简便的写法可以使用第二种**&&的形式进行拼接。但是如果需要拼接内表或结构体等内容时,则还是需要使用关键词CONCATENATE**进行拼接。

2.语法结构

1
2
3
4
5
CONCATENATE {dobj1 dobj2 ...}|{LINES OF itab} 
INTO result
[IN {CHARACTER|BYTE} MODE]
[SEPARATED BY sep]
[RESPECTING BLANKS].

3.语法解释与应用

(1)拼接语句 CONCATENATE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
*--------------------------Variables-----------------------------------*
DATA:
LV_STR1 TYPE STRING VALUE 'Hello',
LV_STR2 TYPE STRING VALUE 'World.',
LV_STRING TYPE STRING.
*----------------------------Logic-------------------------------------*
"拼接字符串,两种语句效果相同
LV_STRING = LV_STR1 && LV_STR2.
WRITE: / LV_STRING.

CONCATENATE LV_STR1 LV_STR2 INTO LV_STRING.
WRITE: / LV_STRING.

"运行结果:
"HelloWorld.
"HelloWorld.
(2)添加拼接符 SEPARATED BY

&&的形式拼接的字符串无法像CONCATENATE关键词一样使用SPACE关键词。**&&使用SPACE关键词进行拼接时,SPACE会失效。如果想要使用&&在字符串中间拼接空格则可以考虑使用制表符号`**所包含的空格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*--------------------------Variables-----------------------------------*
DATA:
LV_STR1 TYPE STRING VALUE 'Hello',
LV_STR2 TYPE STRING VALUE 'World.',
LV_STRING TYPE STRING,
LV_TEST TYPE C VALUE ` `.
*----------------------------Logic-------------------------------------*
"添加拼接符
"上下两句效果相同,即便使用变量中间添加制表符空格也无法生效
LV_STRING = LV_STR1 && LV_TEST && LV_STR2.
WRITE: / LV_STRING.
LV_STRING = LV_STR1 && SPACE && LV_STR2.
WRITE: / LV_STRING.

LV_STRING = LV_STR1 && ` ` && LV_STR2.
WRITE: / LV_STRING.

CONCATENATE LV_STR1 LV_STR2 INTO LV_STRING SEPARATED BY SPACE.
WRITE: / LV_STRING.
"运行结果:
"HelloWorld.
"HelloWorld.
"Hello World.
"Hello World.
(3)合并内表 LINES OF

合并内表的关键词是LINES OF。但是该关键词只能用于单字段内表,且类型为字符类型或STRING类型的字段使用。单字段内表的意思就是只有一个字段的内表,且类型只能为CNDTSTRING

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
*--------------------------Variables-----------------------------------*
DATA:
LT_TABLE TYPE TABLE OF CHAR20,
LV_STRING TYPE STRING.
*----------------------------Logic-------------------------------------*
"合并内表
APPEND 'Hello' TO LT_TABLE.
APPEND 'World.' TO LT_TABLE.
APPEND 'l am an' TO LT_TABLE.
APPEND 'ABAP' TO LT_TABLE.
APPEND 'programmer.' TO LT_TABLE.

CONCATENATE LINES OF LT_TABLE INTO LV_STRING.
WRITE: / LV_STRING.
"HelloWorld.l am anABAPprogrammer.

CONCATENATE LINES OF LT_TABLE INTO LV_STRING SEPARATED BY SPACE.
WRITE: / LV_STRING.
"Hello World. l am an ABAP programmer.
(4)保留尾部空格 RESPECTING BLANKS

该语句意思其实是指填充变量后续的空格。例如一个C类型长度为10的变量初始值为123,另一个相同类型的变量初始值为1。使用该语句进行拼接之后结果为123[ ]1([]中间为7个空格)。因为第一个变量实际内容只占用了3个长度,所以使用该语句进行拼接时会将后续的7个长度按照空格的形式进行补齐。但是合并后的最后字符串并不会将空格补齐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*--------------------------Variables-----------------------------------*
DATA:
LT_TABLE TYPE TABLE OF CHAR10.
*----------------------------Logic-------------------------------------*
APPEND 'Hello' TO LT_TABLE.
APPEND 'World.' TO LT_TABLE.
APPEND 'l am an' TO LT_TABLE.
APPEND 'ABAP' TO LT_TABLE.
APPEND 'programmer.' TO LT_TABLE.

CONCATENATE LINES OF LT_TABLE INTO LV_STRING SEPARATED BY SPACE.
WRITE: / LV_STRING.
"Hello World. l am an ABAP programmer

"保留尾部空格
CONCATENATE LINES OF LT_TABLE INTO LV_STRING RESPECTING BLANKS.
WRITE: / LV_STRING.
"Hello World. l am an ABAP programmer

九、字符串分割 SPLIT

1.介绍

如果想要根据某一字段或内容对字符串进行分割,则可以使用关键词SPLIT进行分割。如果想要按照位置开始截取字符串则可以考虑使用较为简便的 **字符串+截取开始位置(截取长度)**方式进行截取。

2.语法结构

1
2
3
SPLIT dobj AT sep INTO 
{ {result1 result2 [...]} | {TABLE result_tab} }
[IN {CHARACTER|BYTE} MODE].

3.语法解释与应用

(1)截取字符串到变量 INTO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
*--------------------------Variables-----------------------------------*
CONSTANTS:
LC_SPLIT TYPE C LENGTH 1 VALUE '|'.
DATA:
LV_SPLIT TYPE STRING VALUE 'QWE|RTY|UIO',
LV_STR1 TYPE STRING,
LV_STR2 TYPE STRING,
LV_STR3 TYPE STRING.
*----------------------------Logic-------------------------------------*
"截取字符串到变量
SPLIT LV_SPLIT AT LC_SPLIT INTO LV_STR1 LV_STR2 LV_STR3.
WRITE: / LV_STR1,
/ LV_STR2,
/ LV_STR3.
"运行结果:
"QWE
"RTY
"UIO
(2)截取字符串到内表 TABLE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
*--------------------------Variables-----------------------------------*
CONSTANTS:
LC_SPLIT TYPE C LENGTH 1 VALUE '|'.
DATA:
LV_SPLIT TYPE STRING VALUE 'QWE|RTY|UIO',
LT_TABSTR TYPE TABLE OF STRING.
*----------------------------Logic-------------------------------------*
"截取字符串到内表
SPLIT LV_SPLIT AT LC_SPLIT INTO TABLE LT_TABSTR.
LOOP AT LT_TABSTR INTO LV_SPLIT.
WRITE: / LV_SPLIT.
CLEAR: LV_SPLIT.
ENDLOOP.
"运行结果:
"QWE
"RTY
"UIO

十、字符串匹配模式

1.介绍

字符串的匹配模式主要包含以下四种:

  • CO / CN:contains only or not(是否仅包含)
  • CA / NA:contains any or not any(包含或不包含任何)
  • CS / NS:contain string or not(是否包含字符串)
  • CP / NP:contains pattern or not(是否包含图案)

注:在比较两个字符串时,字符串前的空格会计入进行比较,但是字符串末尾的空格不会计入进行比较。

2.包含于 / 不包含 字符比较 CO / CN

(1)说明

<str1> CO <str2>:str1包含于或等于str2,返回true。str1中字符均可以在str2中找到。区分大小写,顺序无要求。

<str1> CN <str2>:str1不仅包含于或等于str2,str1中存在str2中不存在的字符,返回true。区分大小写,顺序无要求。

(2)注意事项

使用这两者对数据进行对比时,等号左右两侧的数据类型对结果会有影响。所以建议将数据全部转化为String类型进行比较

推测造成这样的原因是因为定长的数据类型会自动填充空格在其中进行比较,所以会对结果进行影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE C LENGTH 3 VALUE 'qaz',
LV_STRING2 TYPE C LENGTH 9 VALUE 'qweasdzxc',
LV_STR1 TYPE C LENGTH 5 VALUE 'qaz',
LV_STR2 TYPE C LENGTH 9 VALUE 'qweasdzxc'.
*----------------------------Logic-------------------------------------*
IF LV_STRING1 CO LV_STRING2.
WRITE: / 'CO True'.
ELSE.
WRITE: / 'CO False'.
ENDIF.
"运行结果:
"CO True

IF LV_STR1 CO LV_STR2.
WRITE: / 'CO True'.
ELSE.
WRITE: / 'CO False'.
ENDIF.
"运行结果:
"CO False
(3)代码实例
① CO 包含于关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE 'qaz',
LV_STRING2 TYPE STRING VALUE 'qweasdzxc'.
*----------------------------Logic-------------------------------------*
"STRING1的内容包含于/等于STRING2的内容,不会比较空格
"反过来可以说STRING2包含STRING1
IF LV_STRING1 CO LV_STRING2.
WRITE: / 'CO True'.
ELSE.
WRITE: / 'CO False'.
ENDIF.
"运行结果:
"CO True

IF LV_STRING2 CO LV_STRING1.
WRITE: / 'CO True'.
ELSE.
WRITE: / 'CO False'.
ENDIF.
"运行结果:
"CO False
② CN 两字符串是否有非交集字符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE '1qaz',
LV_STRING2 TYPE STRING VALUE 'qweasdzxc'.
*----------------------------Logic-------------------------------------*
"STRING1的部分内容与STRING2重合,但还拥有自己的内容
"也就是查看两个字符串的字符是否拥有非交集的部分
IF LV_STRING1 CN LV_STRING2.
WRITE: / 'CN True'.
ELSE.
WRITE: / 'CN False'.
ENDIF.
"运行结果:
"CN True

LV_STRING1 = 'qaz'.
IF LV_STRING2 CN LV_STRING1.
WRITE: / 'CN True'.
ELSE.
WRITE: / 'CN False'.
ENDIF.
"运行结果:
"CN False
(4)常使用场景

这两个比较关系经常被用于两字符串中字符的校验。例如我需要比较一个变量中的所有字符是否全是数字时,可以使用这两个比较关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
*--------------------------Variables-----------------------------------*
CONSTANTS:
LC_NUMBER TYPE STRING VALUE '.0123456789'.
DATA:
LV_STRING1 TYPE STRING VALUE '123.45',
LV_STRING2 TYPE STRING VALUE '123.45P'.
*----------------------------Logic-------------------------------------*
"判断字符串中是否全是数字
IF LV_STRING1 CO LC_NUMBER.
WRITE: / '字符串中全是数值'.
ELSE.
WRITE: / '字符串中包含非数值字符'.
ENDIF.
"运行结果:
"字符串中全是数值

"判断字符串中是否存在非数字部分
IF LV_STRING2 CN LC_NUMBER.
WRITE: / '字符串中包含非数值字符'.
ELSE.
WRITE: / '字符串中全是数值'.
ENDIF.
"运行结果:
"字符串中包含非数值字符

3.存在交集 / 不存在交集 字符比较 CA / NA

(1)说明

<str1> CA <str2>:str1包含于str2的任何内容,返回true。区分大小写,顺序无要求。

<str1> NA <str2>:str1不包含于str2的任何内容,返回true。区分大小写,顺序无要求。

(2)代码示例
① CA 两者字符存在交集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE 'qaz',
LV_STRING2 TYPE STRING VALUE 'qweasdzxc'.
*----------------------------Logic-------------------------------------*
IF LV_STRING1 CA LV_STRING2.
WRITE: / 'CA True'.
ELSE.
WRITE: / 'CA False'.
ENDIF.
"运行结果:
"CA True

IF LV_STRING2 CA LV_STRING1.
WRITE: / 'CA True'.
ELSE.
WRITE: / 'CA False'.
ENDIF.
"运行结果:
"CA True
② NA 两者字符不存在交集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE 'QAZ',
LV_STRING2 TYPE STRING VALUE 'qweasdzxc'.
*----------------------------Logic-------------------------------------*
IF LV_STRING1 NA LV_STRING2.
WRITE: / 'NA True'.
ELSE.
WRITE: / 'NA False'.
ENDIF.
"运行结果:
"NA True

LV_STRING1 = 'QaZ'.
LV_STRING2 = 'qweasdzxc'.
IF LV_STRING1 NA LV_STRING2.
WRITE: / 'NA True'.
ELSE.
WRITE: / 'NA False'.
ENDIF.
"运行结果: 两字符之间存在交集字符a
"NA False

4.包含 / 不包含 字符串比较 CS / NS

(1)说明

<str1> CS <str2>:str1包含str2的字符串,返回true。此时比较的是字符串而不再是字符。不区分大小写顺序有要求

<str1> NS <str2>:str1不包含str2的字符串,返回true。此时比较的是字符串而不再是字符。不区分大小写,顺序有要求

(2)代码示例
① CS 包含关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE 'qweasdzxc',
LV_STRING2 TYPE STRING VALUE 'QW'.
*----------------------------Logic-------------------------------------*
IF LV_STRING1 CS LV_STRING2.
WRITE: / 'CS True'.
ELSE.
WRITE: / 'CS False'.
ENDIF.
"运行结果:
"CS True

LV_STRING1 = 'qweasdzxc'.
LV_STRING2 = 'qe'.
IF LV_STRING1 CS LV_STRING2.
WRITE: / 'CS True'.
ELSE.
WRITE: / 'CS False'.
ENDIF.
"运行结果:
"CS False
② NS 不包含关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE 'qweasdzxc',
LV_STRING2 TYPE STRING VALUE 'Qe'.
*----------------------------Logic-------------------------------------*
IF LV_STRING1 NS LV_STRING2.
WRITE: / 'NS True'.
ELSE.
WRITE: / 'NS False'.
ENDIF.
"运行结果:
"NS True

LV_STRING1 = 'qweasdzxc'.
LV_STRING2 = 'QW'.
IF LV_STRING1 NS LV_STRING2.
WRITE: / 'NS True'.
ELSE.
WRITE: / 'NS False'.
ENDIF.
"运行结果:
"NS False

5.模糊匹配 CP / NP

(1)说明

这两种比较关键词是模式匹配,默认不区分大小写,对顺序有要求。但是在语句中, # 表示区分大小写 * 代表任意字符。

<str1> CP <str2>:str1包含str2的字符串,返回true。

<str1> NP <str2>:str1不包含str2的字符串,返回true。

(2)代码示例
① 模糊匹配 包含 CP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE 'qweasdzxc',
LV_STRING2 TYPE STRING VALUE '#q*',
LV_STRING3 TYPE STRING VALUE '#Q*'.
*----------------------------Logic-------------------------------------*
IF LV_STRING1 CP LV_STRING2.
WRITE: / 'CP True'.
ELSE.
WRITE: / 'CP False'.
ENDIF.
"运行结果:
"CP True

IF LV_STRING1 CP LV_STRING3.
WRITE: / 'CP True'.
ELSE.
WRITE: / 'CP False'.
ENDIF.
"运行结果:
"CP False
② 模糊匹配 不包含 NP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
*--------------------------Variables-----------------------------------*
DATA:
LV_STRING1 TYPE STRING VALUE 'qweasdzxc',
LV_STRING2 TYPE STRING VALUE '#q*',
LV_STRING3 TYPE STRING VALUE '#Q*'.
*----------------------------Logic-------------------------------------*
IF LV_STRING1 NP LV_STRING3.
WRITE: / 'NP True'.
ELSE.
WRITE: / 'NP False'.
ENDIF.
"运行结果:
"NP True

IF LV_STRING1 NP LV_STRING2.
WRITE: / 'NP True'.
ELSE.
WRITE: / 'NP False'.
ENDIF.
"运行结果:
"NP False

十一、参考资料

ABAP学习

sap ABAP 字符串常用操作

SAP ABAP常用字符串处理

评论